[MSSQL] 產生特定條件的連續時間區段


Posted by mike-hsieh on 2023-10-19

由於最近系統開發,需要產生一個特定條件的連續時間區段(如下圖),在此簡單紀錄作法。

條件:

  1. 時間區段的定義是有兩個時間,起始時間跟結束時間。
  2. 每個時間區段為20分鐘。
  3. 每三個時間區段的下一個時間區段多5分鐘。
  4. 整個連續時間的完整區段是14:00~17:30。

解法思路:

  1. 使用遞迴,透過結束時間的不斷加總,當大於最終結束時間(17:30)時停止。
  2. 判斷哪個時間區段是[每3個時段的下一個時間區段],相當於以下方式:
    2.1 序號取4的餘數 = 0
    2.2 Index % 4 = 0
DECLARE @StartTime TIME = '14:00:00';
DECLARE @EndTime TIME = '17:30:00';

;WITH TimeSlots AS
(
    -- Base case
    SELECT @StartTime AS SlotStartTime,
           DATEADD(MINUTE, 20, @StartTime) AS SlotEndTime,
           1 AS Cnt

    UNION ALL

    -- Recursive part
    SELECT 
           SlotEndTime AS SlotStartTime,
           CASE 
               WHEN (Cnt + 1) % 4 = 0 THEN DATEADD(MINUTE, 25, SlotEndTime) 
               ELSE DATEADD(MINUTE, 20, SlotEndTime)
           END AS SlotEndTime,
           Cnt + 1
    FROM TimeSlots
    WHERE SlotEndTime < @EndTime
)

-- Output
SELECT 
    CONVERT(TIME, SlotStartTime) AS StartSlot, 
    CONVERT(TIME, SlotEndTime) AS EndSlot, 
    DATEDIFF(SECOND, SlotStartTime, SlotEndTime) / 60 AS 'Duration',
    DATEDIFF(SECOND, SlotStartTime, SlotEndTime) / 60 - 20 AS 'Diff'
FROM TimeSlots
WHERE SlotEndTime <= @EndTime;

#MSSQL #產生特定條件的連續時間區段 #產生時間區段







Related Posts

Beautifulsoup Basic (Python)

Beautifulsoup Basic (Python)

Ceres 函式庫簡介

Ceres 函式庫簡介

團隊的推進器 — 開放與學習

團隊的推進器 — 開放與學習


Comments